package add_$14_Case_8_3;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

public class Bank extends Thread {

    private List<User> userList;

    // 构造方法接收用户集合
    public Bank(List<User> userList) {
        super();
        this.userList = userList;
    }

    // getter和setter
    public List<User> getUserList() {
        return userList;
    }
    public void setUserList(List<User> userList) {
        this.userList = userList;
    }

    // 存钱(输入的卡号, 输入的密码, 要存入钱的数目)
    public Boolean saveMoney(String CardName, String pwd, String toSaveMoney) {

        // 通过卡号从UserList集合中查找对应的用户
        User user = getUserByCard(CardName);

        synchronized (Bank.class) {

            if (user != null && user.getU_login_name().equals(CardName) && user.getU_login_pwd().equals(pwd)) {

                // 获取余额
                BigDecimal u_balance = new BigDecimal(user.getU_balance());

                // 获取存入的钱
                BigDecimal u_saved_money = new BigDecimal(toSaveMoney);
                
                // 通过set方法对user对象的余额变量值做改动，使其变为存钱后的金额数目
                user.setU_balance(u_balance.add(u_saved_money).toString());  //add()加上一个数
                
                // 获取系统当前时间
                Date date = new Date();
                
                // 通过set方法对user对象的存钱时间变量赋值，赋值为当前系统时间
                user.setSave_money_time(date);

                // 格式化存款时间
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String time = sdf.format(user.getSave_money_time());

                // 输出
                System.out.println(Thread.currentThread().getName() + "存钱-->" + user.getU_name() + "在" + time + "存了["
                 + toSaveMoney + "]元，余额：" + user.getU_balance());

                // 返回
                return true;
            }
        }

        // 存钱失败了
        System.out.println(Thread.currentThread().getName() + "存钱失败了！");
        return false;
    }

    // 通过卡号找到用户的方法
    public synchronized User getUserByCard(String CardName) {
        // TODO Auto-generated method stub
        for (User user : userList) {
            if (user.getU_login_name().equals(CardName)) {
                return user;
            }
        }
        return null;
    }

    // 取钱(输入的卡号, 输入的密码, 要取出的钱的数目)
    public boolean drawMoney(String CardName, String pwd, String toDrawMoney) {

        User user = getUserByCard(CardName);

        synchronized (Bank.class) {
            
            if (user != null && user.getU_login_name().equals(CardName) && user.getU_login_pwd().equals(pwd)) {

                // 获取余额
                BigDecimal u_balance = new BigDecimal(user.getU_balance());

                // 获取要取出的钱
                BigDecimal u_drawed_money = new BigDecimal(toDrawMoney);
                
                // 判断能否取这么多钱
                // CompareTo方法：如果指定的数与参数相等返回 0。如果指定的数小于参数返回 -1。如果指定的数大于参数返回 1。
                if(u_balance.compareTo(u_drawed_money) > 0) {
                    // 如果能，则取钱
                    
                    // 通过set方法对user对象的余额变量值做改动，使其变为取钱后的金额数目
                    user.setU_balance(u_balance.subtract(u_drawed_money).toString());   //subtract()减去一个数
                    
                    // 获取系统当前时间
                    Date date = new Date();
                    
                    // 通过set方法对user对象的取钱时间变量赋值，赋值为当前系统时间
                    user.setDraw_money_time(date);
                    
                    // 格式化存款时间
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    String time = sdf.format(user.getDraw_money_time());

                    // 输出
                    System.out.println(Thread.currentThread().getName() + "取钱-->" + user.getU_name() + "在" + time + "取出了"
                     + toDrawMoney + "元，余额：" + user.getU_balance());
                    
                    // 返回
                    return true;
                    
                } else {
                    
                    System.out.println("要取" + toDrawMoney + "元，余额不足，当前余额：" + user.getU_balance());
                    
                }
            }
        }
        // 取钱失败了
        System.out.println(Thread.currentThread().getName() + "取钱失败了！");
        return false;

    }
    
    // 延时
    public void delay(Integer moments) {
        // TODO Auto-generated method stub
        try {
            Thread.sleep(moments);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}